package main


/**
接口
（1）接口中可以定义一组方法，但不需要实现，不需要方法体。并且接口中不能包含任何变量。到某个自定义类型要使用的时候（实现接口的时候）,再根据具体情况把这些方法具体实现出来。
（2）实现接口要实现所有的方法才是实现。
（3）Golang中的接口不需要显式的实现接口。Golang中没有implement关键字。
（Golang中实现接口是基于方法的，不是基于接口的）
 */
import "fmt"
//接口的定义：定义规则、定义规范，定义某种能力：
type SayHello interface{
	//声明没有实现的方法：
	sayHello()
}
//接口的实现：定义一个结构体：
//中国人：
type Chinese struct{
}
//实现接口的方法---》具体的实现：
func (person Chinese) sayHello(){
	fmt.Println("你好")
}
//中国人特有的方法
func (person Chinese) niuYangGe(){
	fmt.Println("东北文化-扭秧歌")
}

//接口的实现：定义一个结构体：
//美国人：
type American struct{
}
//实现接口的方法---》具体的实现：
func (person American) sayHello(){
	fmt.Println("hi")
}
//定义一个函数：专门用来各国人打招呼的函数，接收具备SayHello接口的能力的变量：
func greet(s SayHello){
	s.sayHello()
	//断言：
	var ch Chinese = s.(Chinese)//看s是否能转成Chinese类型并且赋给ch变量
	ch.niuYangGe()
}
func main(){
	//创建一个中国人：
	c := Chinese{}
	//创建一个美国人：
	//a := American{}
	//美国人打招呼：
	//greet(a)
	//中国人打招呼：
	greet(c)
}

